Gatsby is a static web site framework that’s based on React.
We can use it to create static websites from external data sources and more.
In this article, we’ll look at how to create a site with Gatsby.
Querying Data in Pages with GraphQL
We can query data in pages with GraphQL with Gatsby.
To do this, we write:
gatsby-config.js
module.exports = {
siteMetadata: {
title: "My Homepage",
description: "This is where I write my thoughts.",
},
}
src/pages/index.js
import React from "react"
import { graphql } from 'gatsby'
export const query = graphql`
query HomePageQuery {
site {
siteMetadata {
description
}
}
}
`
export default function Home({ data }) {
return (
<div>
Hello!
{data.site.siteMetadata.description}
</div>
)
}
We have the website’s metadata in gatsby-config.js
.
Then we can get the data in our page by using a GraphQL query.
We create the query with the graphql
tag in index.js
.
We use it to get the description of our site.
Then we can get the description in data
prop with the data.site.siteMetadata.description
property.
Now we see:
Hello!This is where I write my thoughts.
displayed.
Add Query Variables to a Page Query
We can add query variables to make our page query more flexible.
For example, we can write:
src/templates/post.js
import React from "react"
import { graphql } from "gatsby"
export default function Template({ data }) {
const { markdownRemark } = data
const { frontmatter, html } = markdownRemark
return (
<div className="blog-post">
<h1>{frontmatter.title}</h1>
<h2>{frontmatter.date}</h2>
<div
className="blog-post-content"
dangerouslySetInnerHTML={{ __html: html }}
/>
</div>
)
}
export const pageQuery = graphql`
query($path: String!) {
markdownRemark(frontmatter: { path: { eq: $path } }) {
html
frontmatter {
date(formatString: "MMMM DD, YYYY")
path
title
}
}
}
`
We add a query that takes the $path
parameter.
And we specified that it’s a string.
Then we pass that into our markdownRemark
query to search for posts with the given path.
Then in the Template
component, we get the query result from the data
prop,
frontmatter
has the front matter, which is a post’s metadata.
And html
has the HTML content.
StaticQuery
Another way to query for data on our website is with the StaticQuery
component.
To use it, we write:
import React from "react"
import { graphql, StaticQuery } from 'gatsby'
export default function Home() {
return (
<div>
<StaticQuery
query={graphql`
query HeadingQuery {
site {
siteMetadata {
title
}
}
}
`}
render={data => (
<header>
<h1>{data.site.siteMetadata.title}</h1>
</header>
)}
/>
</div>
)
}
We use the StaticQuery
component with the query
prop.
It has the GraphQL query we want to make as the value.
Then in the render
prop, we can pass in a function to render the query result.
The data
prop has the query result.
We query the same metadata from the gatsby-config.js
.
Conclusion
Gatsby provides us with several ways to make queries to get data.